import defineReactive from './defineReactive'
import Dep from './Dep'
import observe from './observe'

import { def } from './utils'
import { arrayMethods } from './array'


export default class Observer {
  /**
   * @description 用于将普通的对象变为响应式的
   * @param {Object} value 传入的普通对象
   */
  constructor (value) {
    this.dep = new Dep()
    // 给value添加__ob__属性，属性值就是自己（this）
    def(value, '__ob__', this, false)
    // console.log(value)
    if (Array.isArray(value)) {
      // 如果是数组，需要改写数组方法
      Object.setPrototypeOf(value, arrayMethods)
      // 让数组变得响应式
      this.observeArray(value)
    } else {
      this.walk(value)
    }
  }

  // 给第一层的属性，全部变成响应式的
  // 此外，defineReactive 里面回对子对象再次来一个流程，改成响应式
  walk (value) {
    for (let k in value) {
      defineReactive(value, k)
    }
  }

  observeArray (arr) {
    for (let k of arr) {
      observe(k)
    }
  }
}